Fork me on GitHub

设计模式 - 策略

注意:所有文章除特别说明外,转载请注明出处.

简介

在该模式中,一个类的行为或其算法可以在运行时更改。我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

提示:这里策略模式和桥梁模式相似

场景

1. 系统有很多类,而它们的区别仅仅在于它们的行为不同

2. 一个系统需要动态的在几种算法中选择一种

优点

1. 开闭原则

2. 避免使用多重条件转移语句

3. 提高算法的保密性和安全性

缺点

1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类

2. 产生很多策略类

相关设计模式

1. 策略模式与工厂模式

2. 策略模式和状态模式

策略模式

1.创建接口

public interface Strategy {
   public int doOperation(int num1, int num2);
}

2.创建实现接口的实现类

public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}

public class OperationSubstract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}

public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}

3.创建context类

public class Context {
   private Strategy strategy;

   public Context(Strategy strategy){
      this.strategy = strategy;
   }

   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}

4.使用 Context 来查看当它改变策略 Strategy 时的行为变化

public class StrategyPatternDemo {
   public static void main(String[] args) {

      //当使用策略是加操作时
      Context context = new Context(new OperationAdd());    
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationSubstract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

总结

状态模式和策略模式类似,并且都能够动态改变对象的行为。状态模式是通过状态的转移来改变context所组合的state对象,策略模式是通过context本身来改变组合的strategy对象。所谓的状态转移是指context在运行过程中由于一些条件发生改变而使得state对象发生改变,此过程是在运行过程中。状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。

本文标题:设计模式 - 策略

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:22:45

原始链接:http://bangjinhu.github.io/undefined/设计模式 - 策略模式 - 重点/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.